"""
列表的方法介绍
"""

# 1. 列表一旦初始化，长度是定长的
l = [1, 2, 3, 4]
l[3] = 5
# 如下操作的下标索引超过列表 长度 - 1 ，将报错
# l[4] = 333

# 2. 查看列表的内容，大致了解提供了哪些操作
print(dir(list))

# 3. 增加操作之 append 追加操作
help(list.append)
print(id(l))
append = l.append("追加的元素")
# 该操作无返回结果，或者说返回为 None
print(append)
print(l)
# 通过和上面的id函数打印的内存地址比较可知，内存地址未改变，说明append()方法不会导致列表（地址）变化，只是内容变化了
print(id(l))

# 4. 增加操作之 insert 在指定索引前插入元素
help(list.insert)
print(l)
insert = l.insert(1, 'insert插入')
print(insert)
print(id(l))
print(l)
l.insert(-2, 'insert插入2')
print(id(l))
print(l)

# 5. 增加操作之 extend 将传入可迭代对象的元素插入到列表
help(list.extend)
l1 = [1, 2, 3, 4]
print(id(l1))
l2 = [11, 12, 13, 14]
l1.extend(l2)
print(id(l1))
print(l1)
# 字符串也可以的
s = "我是字符串，也可以迭代"
l3 = [1, 2, 3, 4]
l3.extend(s)
print(l3)

# 6. 删除操作 之 pop。删除并返回指定索引的元素，如果没有指定默认是最右边的元素
print(help(list.pop))
l4 = [1, 2, 3, 4, 5]
pop = l4.pop()
print(pop)
print(l4)
# pop 指定索引的元素，注意不要越界
l__pop = l4.pop(2)
print(l__pop)
print(l4)

# 7. 删除操作 之 remove。删除指定元素第一次出现的值，不存在时将会 Raises ValueError
print(help(list.remove))
l5 = [1, 2, 3, 4, 5, 2, 6]
remove = l5.remove(2)
print(remove)
print(l5)
# 删除指定元素不存在时，下面语句将报错
# l5.remove(222)

# 8. 删除操作 之 clear() 清空元素
l6 = [1, 2, 3, 4, 5, 2, 6]
l6.clear()
print(l6)
# 虽然也可以通过引用空列表实现清空元素效果，但是指向内存地址不同，所以就会让原列表对象失去引用，被垃圾回收
l7 = [1, 2, 3, 4, 5, 2, 6]
print(id(l7))
# 对象 [1, 2, 3, 4, 5, 2, 6] 失去引用，之后将会被垃圾回收
l7 = []
print(id(l7))
print(l7)

# 9. sort 排序操作。如果需要排序操作，注意列表中的元素需要是相同类型
help(list.sort)
l11 = [1, 2, 3, 4, 5, 2, 6]
print(id(l11))
l11.sort()
print(id(l11))
print(l11)
# 默认排序方式是升序，需要需要倒序可以通过设置 reverse=True 来实现
l11.sort(reverse=True)
print(id(l11))
print(l11)
# 使用python内置函数排序的话，不会影响原来列表，会产生新的对象，分配内存地址
l13 = [1, 2, 3, 4, 5, 2, 6]
sorted1 = sorted(l13)
print(l13)
print(sorted1)
print(id(l13))
print(id(sorted1))

# 10 reverse实现内容元素反序（注意不是倒序）
l12 = [1, 2, 3, 4, 5, 2, 6]
print(id(l12))
l12.reverse()
print(l12)
print(id(l12))
# 使用python内置函数反序的话，不会影响原来列表，会产生新的对象，分配内存地址
l14 = [1, 2, 3, 4, 5, 2, 6]
i = reversed(l14)
list1 = list(i)
print(l14)
print(list1)
print(id(l14))
print(id(list1))

# 10. 变量和对象引用关系的分析展示
l8 = [1, 2, 3, 4, 5, 2, 6]
l9 = [1, 2, 3, 4, 5, 2, 6]
print(id(l8))
print(id(l9))

l10 = l8
print(id(l8))
print(id(l10))
# 通过变量 l10 修改了其引用的对象 [1, 2, 3, 4, 5, 2, 6]，而 变量 l8 也引用了该对象，所以通过变量 l8 展示的列表元素内容也被修改了
l10[1] = '修改了'
print(l8)
print(l10)

